import sys
from pathlib import Path
from ffmpy import FFmpeg, FFRuntimeError

def batch_convert_aac_to_m4a(directory: str | Path):
    """
    使用 pathlib 和 ffmpy 将指定目录中的所有 .aac 文件无损转换为 .m4a 文件。

    这个函数会遍历目录，找到所有 .aac 文件，并使用 FFmpeg 的流复制功能
    将它们转换为 .m4a 容器格式，原始的 AAC 音频编码和质量保持不变。

    Args:
        directory (str or Path): 包含 .aac 文件的目录路径。
    """
    # 将输入转换为 Path 对象，这是 pathlib 的核心
    target_dir = Path(directory)

    print(f"开始处理目录: {target_dir.resolve()}\n")
    
    # 确保目标路径存在且是一个目录
    if not target_dir.is_dir():
        print(f"错误：目录 '{target_dir}' 不存在或不是一个目录。")
        sys.exit(1) # 使用 sys.exit 退出脚本

    # 遍历目录中的所有项目
    for input_path in target_dir.iterdir():
        # 检查是否是文件，以及后缀是否是 .aac (不区分大小写)
        if input_path.is_file() and input_path.suffix.lower() == '.aac':
            
            # 使用 .with_suffix() 方法优雅地构建输出路径
            output_path = input_path.with_suffix('.m4a')

            # 检查输出文件是否已存在，如果存在则跳过
            if output_path.exists():
                print(f"跳过: 输出文件 '{output_path.name}' 已存在。")
                continue

            print(f"正在转换: {input_path.name} -> {output_path.name}")

            # 设置 ffmpy 参数
            # FFmpeg 的输入输出需要字符串格式的路径，所以用 str() 转换
            ff = FFmpeg(
                inputs={str(input_path): None},
                outputs={str(output_path): '-c copy'}
            )
            
            # 执行转换
            try:
                ff.run()
                print(f"成功: '{input_path.name}' 已转换为 '{output_path.name}'")
            except FFRuntimeError as e:
                print(f"失败: 转换 '{input_path.name}' 时出错。")
                # e.stderr 可能是 bytes 类型，解码为 utf-8 以便正确显示
                stderr_output = e.stderr.decode('utf-8', errors='ignore') if e.stderr else '没有可用的错误信息'
                print(f"  FFmpeg 错误信息: {stderr_output}")
            except Exception as e:
                print(f"失败: 发生未知错误: {e}")
            
            print("-" * 20)

    print("\n所有转换任务完成！")

if __name__ == '__main__':
    target_directory = Path(r'F:\Documents\Music') 

    batch_convert_aac_to_m4a(target_directory)